Day8
go 的變數有著各式各樣的型態: int float string pointer ...
那麼 ...當變數變成一大包的組合時,會發生什麼事呢 ...
一件衣服的 價格、size
車子的 年份、車門數、加速度、油耗、cc數
平面座標系中的 X,Y 座標
一棟房子的 坪數、面寬、樓高、建材...等等
若用單層的變數會顯得非常的笨重
price := 1000000000
size := 100.17
width := 6.6
height := 3.6
kitchen := "BOSCH"
bathroom := "KOHLER"
變數的組合 struct
目前為止的例子中,變數都是儲存單一的值。如果想用變數表示較複雜的概念,請使用 struct
golang 中會使用 結構 (struct) 來表示複合的概念;
來看個簡單的例子
type Demo struct {
x float64
y float64
}
如果我們只需要使用結構,但不想創造新的型別,也可以使用匿名結構。
package main
import (
"fmt"
)
func main() {
p := struct {
x float64
y float64
}{x: 3.0, y: 4.0}
fmt.Println(p.x)
fmt.Println(p.y)
}
可以分別印出 p struct 下,p.x p.y 的值
在宣告 struct時 同時 定義新的型別,以利後續程式呼叫,比方說環境變數、http client 的 domain、grpc client 的連線初始化
struct 是一整包變數的組合,那麼 …
當 struct 裡面又包 struct 時
當 struct 裡面包 struct 然後又包 struct 時 ... 會發生什麼事呢?
下面宣告了 Point 型別,該型別有兩個屬性 (field),分別是 x 和 y,兩者資料型態皆為 float64
接著,我們宣告一個變數 p 以及及賦值;最後,我們呼叫 p 的屬性 x 和 y。
func main() {
p := Point{x: 3.0, y: 4.0}
fmt.Println(p.x)
fmt.Println(p.y)
}
struct 裡的屬性,不一定要相同
type Demo struct {
x1 float64
x2 int64
x3 string
x4 bool
x5 map[string]interface{}
x6 []int
}
struct 的屬性,也可以用另一個 struct
package main
import "fmt"
type KitchenSet struct {
Stove string // 爐子 sove
Oven string // 烤爐
Dishwasher string // 洗碗機
KitchenIsland string // 中島
Bar string // 吧台
}
type House struct {
Name string
Price int
Size float64
Kitchen KitchenSet
}
func main() {
c := House{
Name: "Dibao",
Price: 1000000000,
Size: 200.87,
Kitchen: KitchenSet{
Stove: "BOCSH",
KitchenIsland: "Mediterranean",
Oven: "Taya",
},
}
fmt.Println(c.Name)
fmt.Println(c.Price)
fmt.Println(c.Kitchen.Stove)
}
我宣告了一個 KitchenSet 類別
接著, House,類別,該型別有四個屬性,分別是 Name、 Price、Size、Kitchen
其中 Kitchen 用到先前宣告的 KitchenSet 類別。
關於 struct 的部分在實務上是非常常用的,除非是很單純的功能 的 func,不然...動輒十幾二十幾個參數,如果不用 struct 的方式做傳遞 , 方法或類別的命名會非常非常的雜亂